package com.ainge.easystudy.thread;

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

/**
 * @author: Ainge
 * @Time: 2021/8/29 23:59
 */
public class CyclicBarrierTest {

    public static void main(String[] args) {

        CyclicBarrier cyclicBarrier = new CyclicBarrier(3,()->{
            System.out.println("三条线程进入完毕。。。");
        });

        /**
         * 线程0，线程1，线程2
         * 线程0拿到锁，并且condition.await();
         * 线程1拿到锁，并且condition.await();
         * 线程2拿到锁，并且index = count == 0了，执行barrierAction后，并且唤醒线程0，1先后入CLH等待队列，等待线程2unLock释放锁
         * 线程2释放锁后，执行自己的后续业务操作
         * 线程0拿到锁，线程0unLock释放锁，执行自己的后续业务操作
         * 线程1拿到锁，线程1unLock释放锁，执行自己的后续业务操作
         * （释放锁的过程虽然很快，但是是按顺序释放噢）
         */
        new Thread(()->{
            try {
                int await = cyclicBarrier.await();
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (BrokenBarrierException e) {
                e.printStackTrace();
            }
            for (int i = 0; i < 1; i++) {
                System.out.println(Thread.currentThread().getName()+"___"+i);
            }
        }).start();


        new Thread(()->{
            try {
                int await = cyclicBarrier.await();
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (BrokenBarrierException e) {
                e.printStackTrace();
            }
            for (int i = 0; i < 1; i++) {
                System.out.println(Thread.currentThread().getName()+"___"+i);
            }
        }).start();


        new Thread(()->{
            try {
                int await = cyclicBarrier.await();
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (BrokenBarrierException e) {
                e.printStackTrace();
            }
            for (int i = 0; i < 1; i++) {
                System.out.println(Thread.currentThread().getName()+"___"+i);
            }
        }).start();


    }
}
